# 字典
# kv结构使得字典增删查改很快 哈希表直接映射

# a = {}
# print(type(a))
# b = dict()
# print(type(b))

# 创建时设置初始值
# 其中:前面的是key 后面的是value kv合在一起称为一个键值对
# a = {'id' : 1, 'name' : 'zhangsan'}
# print(type(a))
# print(a)
# key有要求 1、可哈希 2、在一个字典中不能重复
# value没有要求
##################################################################################
# # in 判断key存不存在于字典中 这个操作和value没有关系
# # not in判断key是否不在字典中
# a = {'id' : 1, 'name' : 'zhangsan'}
# print('id' in a)
# print('name' in a)
# print('idlll' in a)
# print('id' not in a)
# print('name' not in a)
# print('idlll' not in a)
#
#
# # 使用[]来找到key对应的value
# print(a['id'])
# print(a['name'])
# # print(a['idlll'])  当key值不存在时报错
# # 对于字典来说使用in判断key存在与否或者使用[]找key对应的value是高效的 因为底层哈希表
# # 对于元组 列表来说使用in比较低效因为要遍历容器一遍 而[]是高效的 直接索引
##################################################################################

# # 字典中的增删
# a = {'id' : 1, 'name' : 'zhangsan'}
# # 增加新的键值对 直接使用[]即可 若是key已经存在就是修改value 若是不存在就插入了新的键值对
# a['id'] = 10
# a['hello'] = 'world'
# print(a)
# # 插入的键值对是有序的（和插入的顺序一样） 也就是插入在尾部 不像C++中哈希表是无序的
# # Python中的字典不是单纯的哈希表
#
# # 删除使用pop方法 传入key值 那么对应的键值对就会被删除
# a.pop('name')
# print(a)
##################################################################################


# # 字典的遍历操作
# a = {'id' : 1, 'name' : 'zhangsan', 'score' : 100}
# # 使用for循环遍历
# # for key in a:
# #     print(key, a[key])
# # 针对于key value kv的函数
# # keys函数可以获取字典的key值 放到一个类似于但不是列表的自定义类型中
# print(a.keys())
# # values获取字典所有value值
# print(a.values())
# # items获取所有的键值对 一个键值对先放到元组中 多个元组再放到类似于但不是列表的自定义类型中
# print(a.items())
#
# # 于是遍历可以这样写
# for key,value in a.items():
#     print(key, value)

##################################################################################

# # 前面说key值有限制 其中一点是不能重复 另一个就是可哈希才行
# # 什么是可哈希 在Python中可以使用函数hash()判断 可哈希就会返回一个值
# print(hash(1))
# print(hash('aaa'))
# # print(hash([1,2,3])) # 不可哈希
# print(hash((1,2,3)))
# # print(hash({1:3, 2:4})) 不可哈希
#
# # 数字,字符串,元组可哈希 这些都是不能被改变的值
# # 列表,字典不可哈希 这些都可以被改变
# # 结论就是只有不能被改变的值才是可以被哈希的 也就是说字典中的key值必须不能被改变
